home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_57 / menus.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-01  |  7KB  |  197 lines

  1.  
  2. { Menus unit.  Menudefs.inc defines menu structure as a constant and MUST be
  3.  in the current directory. Note that the unit will need to be re-compiled
  4.  when used with a new source file.
  5.  
  6.                                Rowan McKenzie 28/3/89}
  7.  
  8. Unit menus;
  9.  
  10. Interface
  11.  
  12. Uses rm, graph, mousfunc;
  13.  
  14.   {$i menudefs.inc}
  15.  
  16. Var
  17.   menustorage    : Array[1..noheadings]
  18.                      Of Record
  19.                           entry          : Array[1..maxverticalbars]
  20.                                              Of Pointer;
  21.                         End;
  22.  
  23. Procedure draw_menu_box(menuheading, menupos : Integer;
  24.                         invert         : Boolean);
  25.  
  26.   { draws one menu box corresponding to entry menupos under menuheading}
  27.  
  28. Procedure remove_menu_box(menuheading, menupos : Integer);
  29.  
  30.   { removes specified menu box, and restores previos image}
  31.  
  32. Procedure draw_menu_headers;
  33.  
  34.   { draws row of menu heading boxes at top of screen}
  35.  
  36. Procedure draw_menu_column(menuheading : Integer);
  37.  
  38.   { draws column of menu boxes for given heading at top of screen}
  39.  
  40. Procedure remove_menu_column(menuheading : Integer);
  41.  
  42.   { removes column of menu boxes for given heading, and restores image}
  43.  
  44. Function menu_selection(direction, column : Byte) : Integer;
  45.  
  46.  
  47. Implementation
  48.  
  49.  
  50.   Procedure draw_menu_box(menuheading, menupos : Integer;
  51.                           invert         : Boolean);
  52.  
  53.     { draws one menu box corresponding to entry menupos under menuheading}
  54.  
  55.   Var i, x, y, boxwidth, boxheight : Integer;
  56.  
  57.   Begin                           {draw_menu_box}
  58.     settextstyle(menufont, horizdir, menufontsize);
  59.     settextjustify(lefttext, toptext);
  60.     boxwidth := (getmaxx-menuxoffset*2) Div noheadings;
  61.     boxheight := Round(textheight(' ')*1.5);
  62.     x := menuxoffset+(menuheading-1)*boxwidth;
  63.     y := (menupos-1)*boxheight;
  64.     If (menupos > 1) And Not invert Then {menu headers are never removed}
  65.                                          {now save image under box to be drawn}
  66.       getimage(x, y, x+boxwidth, y+boxheight-1,
  67.                menustorage[menuheading].entry[menupos]^);
  68.     If invert Then
  69.       selectfillstyle(solidfill, menucolor)
  70.     Else
  71.       selectfillstyle(solidfill, menubcolor);
  72.     bar(x, y, menuxoffset+(menuheading)*boxwidth, menupos*boxheight-1);
  73.     If invert Then
  74.       selectcolor(menubcolor)
  75.     Else
  76.       selectcolor(menucolor);
  77.     line(x, menupos*boxheight-1,
  78.          menuxoffset+(menuheading)*boxwidth, menupos*boxheight-1);
  79.     line(x, y, x, menupos*boxheight-1);
  80.     line(menuxoffset+(menuheading)*boxwidth, y,
  81.          menuxoffset+(menuheading)*boxwidth, menupos*boxheight-1);
  82.     If (getmaxcolor > 1) And
  83.        Not menustructure[menuheading].entry[menupos].visible
  84.     Then
  85.       selectcolor(menuinvisiblecolor);
  86.     outtextxy(x, y, ' '+menustructure[menuheading].entry[menupos].title);
  87.     selectcolor(menubcolor);
  88.     If Not menustructure[menuheading].entry[menupos].visible
  89.     Then
  90.       For i := 2 To Pred(boxwidth) Div 2 Do
  91.         line(x+i*2, y+2, x+i*2, y+boxheight-2);
  92.   End;                            {draw_menu_box}
  93.  
  94.  
  95.   Procedure remove_menu_box(menuheading, menupos : Integer);
  96.  
  97.     { removes specified menu box, and restores previos image}
  98.  
  99.   Var x, y, boxwidth, boxheight : Integer;
  100.  
  101.   Begin                           {remove_menu_box}
  102.     settextstyle(menufont, horizdir, menufontsize);
  103.     boxwidth := (getmaxx-menuxoffset*2) Div noheadings;
  104.     boxheight := Round(textheight(' ')*1.5);
  105.     x := menuxoffset+(menuheading-1)*boxwidth;
  106.     y := (menupos-1)*boxheight;
  107.     putimage(x, y, menustorage[menuheading].entry[menupos]^, normalput);
  108.   End;                            {remove_menu_box}
  109.  
  110.  
  111.   Procedure draw_menu_headers;
  112.  
  113.     { draws row of menu heading boxes at top of screen}
  114.  
  115.   Var i          : Integer;
  116.  
  117.   Begin                           {draw_menu_headers}
  118.     For i := 1 To noheadings Do
  119.       If menustructure[i].entry[1].selection <> inactive Then
  120.         draw_menu_box(i, 1, False);
  121.   End;                            {draw_menu_headers}
  122.  
  123.  
  124.   Procedure draw_menu_column(menuheading : Integer);
  125.  
  126.     { draws column of menu boxes for given heading at top of screen}
  127.  
  128.   Var i          : Integer;
  129.  
  130.   Begin                           {draw_menu_column}
  131.     For i := 2 To maxverticalbars Do
  132.       If menustructure[menuheading].entry[i].selection <> inactive Then
  133.         draw_menu_box(menuheading, i, False);
  134.   End;                            {draw_menu_column}
  135.  
  136.  
  137.  
  138.   Procedure remove_menu_column(menuheading : Integer);
  139.  
  140.     { removes column of menu boxes for given heading, and restores image}
  141.  
  142.   Var i          : Integer;
  143.  
  144.   Begin                           {remove_menu_column}
  145.     draw_menu_box(menuheading, 1, False);
  146.     For i := 2 To maxverticalbars Do
  147.       If menustructure[menuheading].entry[i].selection <> inactive Then
  148.         remove_menu_box(menuheading, i);
  149.   End;                            {remove_menu_column}
  150.  
  151.  
  152.  
  153.   Function menu_selection(direction, column : Byte) : Integer;
  154.  
  155. { determines which (if any) menu bar was selected in either horizontal (header)
  156.  mode or vertical (sub menu) mode}
  157.  
  158.   Var boxwidth, boxheight, selection : Integer;
  159.  
  160.   Begin                           {menu_selection}
  161.     settextstyle(menufont, horizdir, menufontsize);
  162.     boxwidth := (getmaxx-menuxoffset*2) Div noheadings;
  163.     boxheight := Round(textheight(' ')*1.5);
  164.     Case direction Of
  165.       vertdir :
  166.         Begin
  167.           If (mousex >= menuxoffset+(column-1)*boxwidth) And
  168.           (mousex <= menuxoffset+column*boxwidth) And
  169.           (mousey < menustructure[column].nentries*boxheight) And
  170.           (mousey > boxheight) Then
  171.             selection := mousey Div boxheight+1
  172.           Else
  173.             selection := -1;
  174.           If (selection > -1) And
  175.              Not menustructure[column].entry[selection].visible Then
  176.             selection := -1;
  177.         End;
  178.       horizdir :
  179.         Begin
  180.           If (mousex > menuxoffset) And
  181.           (mousex < menuxoffset
  182.                     +noheadings*((getmaxx-menuxoffset*2) Div noheadings)-1) And
  183.           (mousey <= boxheight) And
  184.           (mousey >= 0) Then
  185.             selection := (mousex-menuxoffset) Div boxwidth+1
  186.           Else
  187.             selection := -1;
  188.           If (selection > -1) And
  189.             Not menustructure[selection].entry[1].visible Then
  190.             selection := -1;
  191.         End;
  192.     End;                          {case}
  193.     menu_selection := selection;
  194.   End;                            {menu_selection}
  195.  
  196. End.
  197.